package com.example.demo.service.serviceImpl;

import com.example.demo.dao.UserMapper;
import com.example.demo.entity.SystemLog;
import com.example.demo.entity.User;
import com.example.demo.result.UserResult;
import com.example.demo.service.SystemLogService;
import com.example.demo.service.UserService;
import com.example.demo.util.Result;
import com.example.demo.util.ResultSubmit;
import com.example.demo.util.TokenUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 用户模块服务层实现类
 */

@Service
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
    @Resource
    UserMapper userMapper;
    @Resource
    SystemLogService systemLogService;

    SimpleDateFormat format =
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // 登录方法
    @Override
    public Result login(String userId, String userPassword, HttpServletRequest request) {
        // 尝试执行以下代码块
        try {
            // 使用userMapper对象的select方法根据userId查询用户信息
            User user = userMapper.select(userId);
            // 获取与当前HTTP请求关联的会话对象，如果不存在则创建一个新的会话
            HttpSession session = request.getSession();
            // 获取当前时间的毫秒数，用作生成token的时间戳
            long time = System.currentTimeMillis();
            // 使用TokenUtil工具类根据用户ID、角色名和时间戳生成一个token
            String token = TokenUtil.getToken(userId, user.getRoleName(), time);
            // 将生成的token存储在会话中，键为"token"
            session.setAttribute("token", token);
            // 将用户ID存储在会话中，键为"userId"
            session.setAttribute("userId", userId);
            // 将用户ID存储在会话中，键为"userName"
            session.setAttribute("userName", user.getUserName());
            // 将用户的角色名存储在会话中，键为"userRole"
            session.setAttribute("userRole", user.getRoleName());
            // 将生成token的时间戳存储在会话中，键为"time"
            session.setAttribute("time", time);
            // 如果查询到的用户密码与输入的用户密码相同
            if (user.getUserPassword().equals(userPassword)) {
                // 创建一个新的UserResult对象用于存放登录成功的用户信息
                UserResult userResult = getUserResult(user);
                // 系统记录
                SystemLog systemLog = new SystemLog();
                systemLog.setUserId(user.getUserId());
                systemLog.setRoleName(user.getRoleName());
                systemLog.setCreateTime(format.format(new Date()));
                systemLog.setUseTableName("user");
                systemLog.setUseTableDataIdBefore(String.valueOf(user.getUserTableId()));
                systemLog.setUseTableDataIdAfter(String.valueOf(user.getUserTableId()));
                systemLog.setUseType("用户登录");
                systemLogService.insertSystemLog(systemLog);
                // 返回登录成功的状态和用户信息
                return ResultSubmit.success(userResult);
            } else {
                // 如果密码不匹配，返回登录失败的状态和错误信息
                return ResultSubmit.fail("登陆失败，密码错误");
            }
            // 如果try块中的代码执行出现异常，则进入catch块
        } catch (Exception e) {
            // 如果异常是空指针异常
            if (e.getClass() == NullPointerException.class) {
                // 返回登录失败的状态和错误信息，提示账户未注册
                return ResultSubmit.fail("登陆失败，账户未注册");
            } else {
                throw e;
            }
        }
    }

    // 用户信息转换方法
    private static UserResult getUserResult(User user) {
        UserResult userResult = new UserResult();
        // 将用户信息设置到UserResult对象中
        userResult.setUserId(user.getUserId());
        userResult.setUserName(user.getUserName());
        userResult.setRoleName(user.getRoleName());
        return userResult;
    }

    // 获取用户信息、房间信息类方法
    @Override
    public Result info(HttpServletRequest request) {
        // 获取当前会话对象，如果不存在则创建一个新的会话
        HttpSession session = request.getSession();
        // 创建一个HashMap用于存储用户相关的信息
        Map<String, String> map = new HashMap<>();
        // 从会话中获取用户角色ID信息，并将其转换为字符串后放入map中
        map.put("userId", session.getAttribute("userId").toString());
        // 从会话中获取用户名称信息，并将其转换为字符串后放入map中
        map.put("userName", session.getAttribute("userName").toString());
        // 从会话中获取用户角色信息，并将其转换为字符串后放入map中
        map.put("roleName", session.getAttribute("userRole").toString());
        // todo 查询并返回房间类型数据
        return ResultSubmit.success(map);
    }

    // 查询全部用户信息方法
    @Override
    public Result selectAllUser(String userId, String userName,
                                String roleName, HttpServletRequest request) {
        return ResultSubmit.success(userMapper.selectAll(userId, userName, roleName));
    }

    // 新增用户信息
    @Override
    public Result insert(User user) {
        user.setUserId(Math.abs((int) System.currentTimeMillis()));
        user.setCreateTime(format.format(new Date()));
        user.setRoleId(2);
        user.setDeleteIdentity("未删除");
        int i = userMapper.insert(user);
        System.out.println("本次插入了" + i + "条数据");
        // todo 系统记录新增
        if (i > 0) {
            return ResultSubmit.success(user);
        } else {
            // 手动回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.fail("添加失败");
        }
    }

    // 修改用户信息
    @Override
    public Result update(User user) {
        int i = userMapper.update(user);
        user.setUserTableId(null);
        user.setCreateTime(format.format(new Date()));
        user.setDeleteIdentity("未删除");
        int j = userMapper.insert(user);
        System.out.println("本次修改了" + i + "条数据");
        System.out.println("本次新增了" + j + "条数据");
        // todo 系统记录新增
        if (i > 0 && j > 0) {
            return ResultSubmit.success(user);
        } else {
            // 手动回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.fail("修改失败");
        }
    }

    // 删除用户信息
    @Override
    public Result delete(String userId) {
        User user = userMapper.select(String.valueOf(userId));
        user.setDeleteIdentity("已删除");
        int i = userMapper.update(user);
        System.out.println("本次删除了" + i + "条数据");
        // todo 系统记录新增
        if (i > 0) {
            return ResultSubmit.success("删除成功");
        } else {
            // 手动回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResultSubmit.fail("删除失败");
        }
    }
}

